Skip to content

[cueweb] Add job dependency graph: inline panel + Cuetopia toggle#2377

Merged
ramonfigueiredo merged 5 commits into
AcademySoftwareFoundation:masterfrom
rajaryan2007:dev-days/2310-dependency-visualization-graph
Jun 3, 2026
Merged

[cueweb] Add job dependency graph: inline panel + Cuetopia toggle#2377
ramonfigueiredo merged 5 commits into
AcademySoftwareFoundation:masterfrom
rajaryan2007:dev-days/2310-dependency-visualization-graph

Conversation

@rajaryan2007

@rajaryan2007 rajaryan2007 commented May 27, 2026

Copy link
Copy Markdown
Contributor

Related Issues

Summarize your change.

Adds a read-only, interactive node-graph view of a job's dependency tree to Cuetopia > Monitor Jobs.

  • React Flow + dagre (JavaScript library for directed graph layout) node-graph in cueweb/components/ui/job-dependency-graph.tsx. Custom DependencyNode with truncate + full-name tooltip, JOB/LAYER/FRAME kind-coded left borders, focus-job ring, and hierarchical labels for layer/frame nodes.
  • Theme-aware: dagre lays out fresh per call (no module-level singleton), data-fetch and cursor-style live in separate useEffects so dark/light toggling doesn't re-fetch the tree, and the crosshair-cursor SVG is scoped per-instance via data-graph-id.
  • Breadth-First Search (BFS) over both directions (GetDepends + GetWhatDependsOnThis), bounded by maxDepth, mirroring CueGUI's JobMonitorGraph.getRecursiveDependentJobs. Each hop resolves names to UUIDs via /api/job/getjobs anchored-regex (cuebot rejects name-only depend lookups) and caches the result, so a 12-job chain costs ~12 lookups across the whole walk.
  • All BFS fetches go through a silent helper that bypasses accessGetApi, so jobs in other shows / unmonitored & finished endpoints don't cascade into red toast notifications.
  • Clicking a node navigates to /jobs/?tab=overview.
  • Graph mounts as a third stacked panel under Frames in cueweb/components/ui/job-details-inline.tsx (CueGUI Monitor-Jobs-dock parity). Panel header has show/hide and close.
  • New Cuetopia > View Job Graph item in the header dropdown and the sidebar (expanded + collapsed). Checkable with the same Check-icon pattern as File > Disable Job Interaction. Menu, panel, and other tabs sync via a new useShowDependencyGraph hook (localStorage + CustomEvent + storage event).
  • getDependsForJob in cueweb/app/utils/get_utils.ts takes a Job and routes through /api/job/action/getdepends, with a data?.depends?.depends ?? data?.depends ?? data ladder so missing upstream fields return [] instead of throwing. New Depend type exported from get_utils.ts.
  • New deps: @xyflow/react ^12, dagre ^0.8.5, @types/dagre.

LLM usage disclosure

Raj Aryan: rajaryan2007

  • Gemini (the browser web version and the VS Code ) was used to assist with how to set up, and some issues and questions

Co-authored-by: Raj Aryan rajaryan150149@gmail.com
Co-authored-by: Ramon Figueiredo rfigueiredo@imageworks.com

@linux-foundation-easycla

linux-foundation-easycla Bot commented May 27, 2026

Copy link
Copy Markdown

CLA Signed
The committers listed above are authorized under a signed CLA.

  • ✅ login: rajaryan2007 / name: rajaryan (b219f89)

@coderabbitai

coderabbitai Bot commented May 27, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

This PR adds a read-only job dependency graph visualization to the job details view. It implements a self-contained graph component using React Flow and dagre that walks job dependencies bidirectionally with bounded depth, resolves job identifiers, fetches edges via silent API calls, builds hierarchical nodes for jobs/layers/frames, and renders an interactive layout. Visibility state is managed via a shared React hook with cross-tab synchronization, and toggles are integrated into the header, sidebar, and job details panel.

Changes

Job Dependency Graph Feature

Layer / File(s) Summary
Dependency data contract and package setup
cueweb/app/utils/get_utils.ts, cueweb/package.json
Depend type and getDependsForJob() helper expose dependency records. @xyflow/react, dagre, and @types/dagre added to dependencies.
Shared visibility state hook
cueweb/app/utils/use_show_dependency_graph.ts
useShowDependencyGraph manages show/hide state with SSR safety, localStorage persistence, and cross-tab synchronization via CustomEvent and storage events.
JobDependencyGraph component with tree walking and layout
cueweb/components/ui/job-dependency-graph.tsx
Component walks job dependencies bidirectionally with bounded depth, caches job name→UUID resolution, fetches downstream and upstream edges in parallel via silent RPCs, builds hierarchical nodes for jobs/layers/frames with de-duplicated edges, applies dagre layout, and renders themed React Flow with node click handling and cursor styling.
Job details panel with graph toggle
cueweb/components/ui/job-details-inline.tsx
Adds "Dependency Graph" toggle button in header and conditionally renders collapsible graph panel below frames table, controlled by shared visibility hook.
Header and sidebar graph visibility toggles
cueweb/components/ui/app-header.tsx, cueweb/components/ui/app-sidebar.tsx
Integrates Cuetopia-scoped "View Job Graph" toggle controls (menu item in header, switch buttons in collapsed and expanded sidebar), wired to shared visibility state.

Sequence Diagram

sequenceDiagram
  participant User
  participant Header as AppHeader
  participant Sidebar as AppSidebar
  participant Hook as useShowDependencyGraph
  participant LocalStorage
  participant JobDetails as JobDetailsInline
  participant Graph as JobDependencyGraph
  participant API
  User->>Header: click "View Job Graph"
  Header->>Hook: toggleGraph()
  Hook->>LocalStorage: set show=true
  Hook->>Header: update state
  Hook->>Sidebar: dispatch CustomEvent
  Sidebar->>Hook: listener updates
  Hook->>JobDetails: update state
  JobDetails->>Graph: render graph
  Graph->>API: resolve job names, fetch depends
  API-->>Graph: nodes and edges
  Graph->>Graph: layout with dagre
  Graph-->>JobDetails: render React Flow
  User->>Graph: click node
  Graph->>JobDetails: onNodeNavigate(jobName)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Suggested reviewers

  • DiegoTavares
  • lithorus
  • ramonfigueiredo

Poem

🐰 A graph of jobs, all tangled and deep,
With arrows that flow while the workers sleep.
React Flow dances with dagre's own grace,
As nodes find their nodes in the right place!
A bunny's delight—dependencies won the race! 🌳✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 61.11% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed All primary coding requirements from #2310 are met: read-only dependency graph implemented with react-flow, dagre layout, clickable nodes for navigation, and theme support.
Out of Scope Changes check ✅ Passed All changes are directly aligned with #2310 objectives; no out-of-scope modifications detected beyond the dependency graph feature implementation.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main changes: adding a job dependency graph visualization with an inline panel and Cuetopia toggle controls.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@ramonfigueiredo

Copy link
Copy Markdown
Collaborator

Hi @rajaryan2007 , thank you for your contribution!

Please note that we recently made major improvements to CueWeb. Please review the PR merged into master:

Please merge the latest master branch into your branch, resolve any conflicts, and update your PR to follow the new CueWeb interface patterns, menus, and UI structure where applicable.

Once your changes are ready, please change the PR status from Draft to Open. This will automatically trigger the initial review by CodeRabbit. After that, I will perform a deeper review of the pull request, provide feedback, and request additional changes if needed.

Once again, thank you for your contribution and support to OpenCue.

Note: I am currently working on the full migration of CueGUI features into CueWeb, so you should expect additional changes to continue being merged into master. Because of that, you may need to periodically sync and merge the latest master updates into your branch during development.

@ramonfigueiredo

Copy link
Copy Markdown
Collaborator

Note: The OpenCue Testing Pipeline / Build CueWeb Docker Image (pull_request) is failing

@rajaryan2007 rajaryan2007 marked this pull request as ready for review May 30, 2026 14:58

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (3)
cueweb/components/ui/job-dependency-graph.tsx (2)

17-34: ⚡ Quick win

Module-level dagreGraph retains stale nodes across layout calls.

dagreGraph is a shared singleton; getLayoutedElements adds nodes/edges but never removes ones from prior runs. Across re-layouts (job switch, theme toggle) stale nodes accumulate, which can skew positions. Instantiate a fresh graph per call.

♻️ Proposed fix
-const dagreGraph = new dagre.graphlib.Graph();
-dagreGraph.setDefaultEdgeLabel(() => ({}));
-
 const nodeWidth = 200;
 const nodeHeight = 80;

 const getLayoutedElements = (nodes: Node[], edges: Edge[], direction = 'TB') => {
+  const dagreGraph = new dagre.graphlib.Graph();
+  dagreGraph.setDefaultEdgeLabel(() => ({}));
   dagreGraph.setGraph({ rankdir: direction });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@cueweb/components/ui/job-dependency-graph.tsx` around lines 17 - 34, The bug
is that the module-level dagreGraph variable retains nodes between calls; change
getLayoutedElements to instantiate a new dagre.graphlib.Graph() inside the
function (instead of using the shared dagreGraph), call setDefaultEdgeLabel and
setGraph on that local graph, then use that local graph for setNode, setEdge and
dagre.layout to ensure each layout call starts with a fresh graph; update/remove
references to the module-level dagreGraph so all layout logic uses the local
variable in getLayoutedElements.

60-125: ⚡ Quick win

Avoid re-fetching dependencies on theme change.

resolvedTheme is in the effect's dependency array, so toggling light/dark triggers a full getDependsForJob network round-trip just to recolor nodes. Consider fetching the raw dependencies in an effect keyed only on job.id, and deriving theme-dependent style either in a separate effect or via useMemo over the cached dependency data.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@cueweb/components/ui/job-dependency-graph.tsx` around lines 60 - 125, The
effect currently re-fetches dependencies whenever resolvedTheme changes because
resolvedTheme is in the dependency array; change this by splitting data fetch
and theme-dependent styling: keep the data-loading effect keyed only on job.id
(the useEffect that calls loadGraph which uses getDependsForJob and populates
rawNodes/rawEdges then calls setNodes/setEdges) so it only fetches once per job,
and remove resolvedTheme from that effect’s deps; then derive node/edge styles
on theme changes separately (e.g., a useMemo or a second effect that maps over
the cached nodes/edges and updates their style based on resolvedTheme) so you
only recolor nodes without calling getDependsForJob again.
cueweb/app/jobs/columns.tsx (1)

27-27: ⚡ Quick win

Remove unused FramesLayersPopup import in cueweb/app/jobs/columns.tsx

FramesLayersPopup is imported (line 27) but not referenced anywhere in the file; remove the import (or use the component).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@cueweb/app/jobs/columns.tsx` at line 27, The import FramesLayersPopup is
unused in the module; remove the import line "FramesLayersPopup" from the
imports in this file (or if the component was intended to be used, add the
appropriate JSX reference to FramesLayersPopup where needed). Update imports so
no unused symbol remains.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@cueweb/app/api/job/getdepends/route.ts`:
- Line 37: The code dereferences responseData.data without guarding for missing
data; update the dependsArray assignment to guard the whole chain (e.g., use
responseData?.data?.depends?.depends || []) so that when responseData or
responseData.data is missing the route returns an empty array instead of
throwing; modify the line that defines dependsArray to use optional chaining on
responseData and data (refer to the dependsArray variable and responseData
object).
- Around line 27-31: Remove the redundant JSON stringify/parse round-trip and
guard against malformed/empty bodies by wrapping await request.json() in a
try/catch; parse into jsonBody (e.g., const jsonBody = await request.json())
inside the try, validate that jsonBody is an object (typeof jsonBody ===
'object' && jsonBody !== null'), and on error or invalid body return
NextResponse.json({ error: 'Invalid request body' }, { status: 400 }); update
the code around jsonBody in route.ts to use this validated value.

In `@cueweb/components/ui/job-dependency-graph.tsx`:
- Around line 110-117: The graph state isn't cleared when a fetch returns no
dependencies, because setNodes/setEdges are only invoked inside the
rawNodes.size > 0 branch; update the logic around getLayoutedElements so that
when rawNodes.size === 0 (or the fetch errors) you explicitly clear state by
calling setNodes([]) and setEdges([]) and also ensure you clear nodes/edges
early when job.id changes (before/when starting the fetch) so the previous graph
won't persist; modify the code that uses rawNodes/rawEdges/getLayoutedElements
and the fetch-handling path to call setNodes([])/setEdges([]) on empty results
or failure.

---

Nitpick comments:
In `@cueweb/app/jobs/columns.tsx`:
- Line 27: The import FramesLayersPopup is unused in the module; remove the
import line "FramesLayersPopup" from the imports in this file (or if the
component was intended to be used, add the appropriate JSX reference to
FramesLayersPopup where needed). Update imports so no unused symbol remains.

In `@cueweb/components/ui/job-dependency-graph.tsx`:
- Around line 17-34: The bug is that the module-level dagreGraph variable
retains nodes between calls; change getLayoutedElements to instantiate a new
dagre.graphlib.Graph() inside the function (instead of using the shared
dagreGraph), call setDefaultEdgeLabel and setGraph on that local graph, then use
that local graph for setNode, setEdge and dagre.layout to ensure each layout
call starts with a fresh graph; update/remove references to the module-level
dagreGraph so all layout logic uses the local variable in getLayoutedElements.
- Around line 60-125: The effect currently re-fetches dependencies whenever
resolvedTheme changes because resolvedTheme is in the dependency array; change
this by splitting data fetch and theme-dependent styling: keep the data-loading
effect keyed only on job.id (the useEffect that calls loadGraph which uses
getDependsForJob and populates rawNodes/rawEdges then calls setNodes/setEdges)
so it only fetches once per job, and remove resolvedTheme from that effect’s
deps; then derive node/edge styles on theme changes separately (e.g., a useMemo
or a second effect that maps over the cached nodes/edges and updates their style
based on resolvedTheme) so you only recolor nodes without calling
getDependsForJob again.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 1d139248-e52f-40fb-8342-4048f85b0cc8

📥 Commits

Reviewing files that changed from the base of the PR and between 3d6d3fc and c8a250e.

⛔ Files ignored due to path filters (1)
  • cueweb/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (7)
  • cueweb/app/api/job/getdepends/route.ts
  • cueweb/app/jobs/columns.tsx
  • cueweb/app/utils/get_utils.ts
  • cueweb/components/ui/frames-layers-popup.tsx
  • cueweb/components/ui/job-dependency-graph.tsx
  • cueweb/components/ui/job-details-inline.tsx
  • cueweb/package.json

Comment thread cueweb/app/api/job/getdepends/route.ts Outdated
Comment thread cueweb/app/api/job/getdepends/route.ts Outdated
Comment thread cueweb/components/ui/job-dependency-graph.tsx Outdated
@ramonfigueiredo

Copy link
Copy Markdown
Collaborator

@rajaryan2007

Thanks for your contributions to the OpenCue project.

I am reviewing your code and this PR.

@ramonfigueiredo ramonfigueiredo changed the title feat(cueweb): Add job dependency tree visualization graph (#2310) [cueweb] Add job dependency tree visualization graph (#2310) Jun 3, 2026
…View Job Graph toggle

- BFS walk now resolves job names to UUIDs via GetJobs regex before hitting GetDepends/GetWhatDependsOnThis (cuebot rejects name-only, so the original implementation crashed with "Job not found" on every hop). All BFS fetches go through a silent helper that bypasses accessGetApi so misses don't cascade into red toasts.
- Killed the module-level dagre.Graph singleton; layoutNodes() now allocates a fresh graph per call so node/edge state doesn't leak across job switches.
- Split the single useEffect into data-fetch (keyed on job.id) and cursor-style (keyed on resolvedTheme) so dark/light toggling no longer re-fetches every depend in the tree.
- Replaced the default react-flow node with a DependencyNode that truncates long names, exposes the full name as a title tooltip, uses kind-coded left borders (JOB/LAYER/FRAME), and rings the focus job. Hierarchical labels for layer/frame nodes keep their job context.
- Scoped the react-flow pane cursor via a per-instance data-graph-id attribute so two graphs on the page don't share a global style; SVG data-URL memoized per theme.
- Clicking a node now navigates to /jobs/<name>?tab=overview instead of firing the misleading "Navigating to..." toast.
- Deleted the duplicate /api/job/getdepends route. getDependsForJob takes a Job (matching getLayersForJob / getFramesForJob) and routes through the validated /api/job/action/getdepends endpoint that the rest of CueWeb already uses.
- Deleted frames-layers-popup.tsx and its FramesLayersPopup trigger in JobDetailsInline (plus the dead import in columns.tsx). The popup duplicated the Layers + Frames tables JobDetailsInline already renders inline.
- The graph now mounts as a third stacked panel inside JobDetailsInline (under the Frames table), matching CueGUI's JobMonitorGraph dock layout. Panel header has a show/hide toggle and a close button.
- New Cuetopia > View Job Graph entry in the header dropdown and the sidebar (expanded + collapsed). Checkable item with the same Check icon pattern as File > Disable Job Interaction. Menu, panel, and other tabs stay in sync via a new useShowDependencyGraph hook (localStorage + CustomEvent + storage event) - replaces the brittle ?graph=1 URL param that couldn't re-open the panel after closing because the URL hadn't changed.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@cueweb/components/ui/app-sidebar.tsx`:
- Around line 499-505: The button toggle that uses role="switch" (the element
that calls toggleGraph and reads showGraph) should not also expose aria-pressed;
remove the aria-pressed={showGraph} attribute so the control uses a single ARIA
state model (role="switch" with aria-checked={showGraph}) to match the expanded
version and avoid conflicting semantics.

In `@cueweb/components/ui/job-dependency-graph.tsx`:
- Around line 85-102: The responses returned by silentGetDepends and
silentGetWhatDependsOnThis may contain snake_case keys (e.g., depend_er_job)
while downstream code (ingestDepend in the dependency walker /
view-dependencies-dialog logic) expects camelCase (dependErJob); update
silentGetDepends and silentGetWhatDependsOnThis to normalize each Depend row to
the camelCase shape before returning (map over seq and copy/rename depend_er_job
-> dependErJob, any other snake_case aliases used by the API to their camelCase
counterparts), so the graph-building and ingestDepend callers always receive the
canonical field names regardless of gateway build.

In `@cueweb/components/ui/job-details-inline.tsx`:
- Around line 305-325: JobDependencyGraph is rendered without the onNodeNavigate
prop so node clicks fall back to router.push and leave the current Layers &
Frames detail view; update the JobDependencyGraph usage to pass an
onNodeNavigate callback that either selects the clicked job in-place (e.g., call
the parent selection handler with the job id/name) or routes to the
layers/frames tab for that job. Locate the JobDependencyGraph component
instantiation in job-details-inline.tsx and add a prop onNodeNavigate={(node) =>
{ /* select job or navigate to ?tab=layers or ?tab=frames for node.id */ }},
ensuring you use the same job selection/navigation functions used elsewhere in
this component to preserve in-place selection behavior instead of the global
router.push fallback.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: ca1dbe93-3b18-4ec4-a155-2a250288d953

📥 Commits

Reviewing files that changed from the base of the PR and between 0aee500 and 5e01719.

📒 Files selected for processing (7)
  • cueweb/app/utils/get_utils.ts
  • cueweb/app/utils/use_show_dependency_graph.ts
  • cueweb/components/ui/app-header.tsx
  • cueweb/components/ui/app-sidebar.tsx
  • cueweb/components/ui/frames-layers-popup.tsx
  • cueweb/components/ui/job-dependency-graph.tsx
  • cueweb/components/ui/job-details-inline.tsx
💤 Files with no reviewable changes (1)
  • cueweb/components/ui/frames-layers-popup.tsx

Comment thread cueweb/components/ui/app-sidebar.tsx
Comment thread cueweb/components/ui/job-dependency-graph.tsx
Comment thread cueweb/components/ui/job-details-inline.tsx
@ramonfigueiredo ramonfigueiredo changed the title [cueweb] Add job dependency tree visualization graph (#2310) [cueweb] Add job dependency graph: inline panel + Cuetopia toggle Jun 3, 2026
@ramonfigueiredo

ramonfigueiredo commented Jun 3, 2026

Copy link
Copy Markdown
Collaborator

Previous version from @rajaryan2007

Screenshot 2026-06-03 at 1 36 00 PM Screenshot 2026-06-03 at 1 39 22 PM Screenshot 2026-06-03 at 1 40 27 PM

New version from @ramonfigueiredo

What's different in this revision?

See commit: [cueweb] Add job dependency graph: inline panel + Cuetopia toggle

Screenshot 2026-06-03 at 3 26 17 PM Screenshot 2026-06-03 at 3 26 38 PM

@ramonfigueiredo changes:

I picked up the previous version on top of master (now that #2386 is merged) and refactored it based on the review comments previously provided.

Key differences from @rajaryan2007's implementation:

  • Placement: The dependency graph is now rendered as a third stacked panel within JobDetailsInline, below Frames, matching CueGUI's JobMonitorGraph dock behaviour. It is no longer displayed in a modal that duplicates the existing Layers and Frames tables.

  • Recursive BFS: Dependency traversal now resolves names to UUIDs through /api/job/getjobs using anchored regex lookups. This avoids cuebot limitations with name-only dependency queries, prevents 500 errors, and enables rendering of the complete dependency chain. UUIDs are cached, reducing lookups to approximately one per job in the chain.

  • Error handling: BFS requests use a silent helper instead of accessGetApi, preventing unnecessary handleError notifications when dependencies reference jobs from other shows or already-finished unmonitored jobs.

  • Bug fixes:

    • Replaced the module-level dagre.Graph singleton with a new graph instance per layoutNodes() call to prevent node leakage between jobs.
    • Split the dependency-loading logic into separate useEffect hooks keyed on job.id and resolvedTheme, avoiding unnecessary reloads on theme changes.
    • Replaced the "Navigating to..." toast with direct navigation using router.push('/jobs/<name>?tab=overview').
    • Scoped .react-flow__pane cursor behavior using data-graph-id instead of applying it globally.
  • Custom node renderer: Added DependencyNode, which truncates long names with full-name tooltips and visually distinguishes JOB, LAYER, and FRAME nodes using colored left borders. Frame nodes retain their parent job context.

  • API reuse: Removed the duplicate /api/job/getdepends endpoint and reused /api/job/action/getdepends introduced in [cueweb/docs] Job menu actions: Part 3 - Implement Dependencies (View Dependencies, Dependency Wizard, Drop External / Internal Dependencies) on CueWeb > Cuetopia job menu + Tree view #2386. getDependsForJob now accepts a Job, consistent with getLayersForJob.

  • Cuetopia integration: Added a checkable "View Job Graph" menu item. It displays a Check icon when enabled, matching the behavior of "File -> Disable Job Interaction". State management is handled through a new useShowDependencyGraph hook backed by localStorage, CustomEvent, and storage events. This replaces the previous ?graph=1 URL parameter approach, which could not reopen the graph after closing it without changing the URL.

Result: The graph now displays the complete dependency tree, avoids unnecessary error notifications, integrates cleanly into the existing job details layout, and provides a consistent menu-toggle experience.

@ramonfigueiredo ramonfigueiredo merged commit 50a6044 into AcademySoftwareFoundation:master Jun 3, 2026
25 checks passed
@ramonfigueiredo

Copy link
Copy Markdown
Collaborator

Thanks for your contributions to the OpenCue project, @rajaryan2007

Excellent job!

PR merged to the master 🎉

ramonfigueiredo added a commit that referenced this pull request Jun 4, 2026
…pia View Job Graph toggle) (#2392)

## Related Issues
- #2310

## Summarize your change.
Documents the read-only, interactive job dependency graph added in #2377
across all six CueWeb docs, plus six screenshots (light + dark).

- user-guides: new "Job dependency graph" section (enable via Cuetopia >
View Job Graph, where it mounts, reading/navigating nodes, empty state),
a Core Features bullet, and the Cuetopia menu toggle note.
- other-guides: UI walkthrough.
- quick-starts: Job Dependency Graph bullet with a screenshot.
- tutorials: "Visualizing the dependency graph" step-by-step subsection.
- reference: "Job dependency graph panel" - component,
useShowDependencyGraph toggle/persistence, BFS tree walk, name->UUID
resolution, silent fetches, node/edge rendering, theme-awareness,
empty/loading states.
- developer-guide: JobDependencyGraph component, updated
JobDetailsInline, useShowDependencyGraph hook,
cueweb:show-dependency-graph-changed event row, and a "Dependency graph
panel" subsection (new @xyflow/react, dagre, @types/dagre deps).

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Documentation**
* Documented the new interactive Job Dependency Graph feature, including
how to enable it via the Cuetopia menu toggle, visualize bidirectional
job dependencies, navigate the graph with pan/zoom controls, and click
nodes to open related job details. Added comprehensive guides covering
feature overview, quick-start, tutorials, user guide, and reference
documentation with screenshots.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants